require 'rake/clean'
require "bundler/gem_tasks"
require "rake/testtask"
require_relative "extsources"

SOURCES = FileList[]

EXTSOURCES.each do |src|
  basename = src.pathmap("%f")
  dest = basename == "LICENSE" ? basename : src.pathmap("%{../..,ext}p")
  dir = dest.pathmap("%d")
  file src
  directory dir
  file dest => [src, dir] do |t|
    cp t.source, t.name
  end
  SOURCES.include dest
end

CLEAN.include SOURCES
CLEAN.include FileList["ext/*.o", "ext/*.metal", "ext/whisper.{so,bundle,dll}"]

task build: ["ext/Makefile", "ext/ruby_whisper.h", "ext/ruby_whisper.cpp", "whispercpp.gemspec"]

directory "pkg"
CLOBBER.include "pkg"

LIB_NAME = "whisper".ext(RbConfig::CONFIG["DLEXT"])
SO_FILE = File.join("ext", LIB_NAME)
LIB_FILE = File.join("lib", LIB_NAME)

file "ext/Makefile" => ["ext/extconf.rb", "ext/ruby_whisper.h", "ext/ruby_whisper.cpp"] + SOURCES do |t|
  Dir.chdir "ext" do
    ruby "extconf.rb"
  end
end

file SO_FILE => "ext/Makefile" do |t|
  Dir.chdir "ext" do
    sh "make"
  end
end
CLEAN.include SO_FILE

directory "lib"
file LIB_FILE => [SO_FILE, "lib"] do |t|
  copy t.source, t.name
end
CLEAN.include LIB_FILE

Rake::TestTask.new do |t|
  t.test_files = FileList["tests/test_*.rb"]
end

TEST_MEMORY_VIEW = "tests/jfk_reader/jfk_reader.#{RbConfig::CONFIG['DLEXT']}"
file TEST_MEMORY_VIEW => "tests/jfk_reader/jfk_reader.c" do |t|
  Dir.chdir "tests/jfk_reader" do
    ruby "extconf.rb"
    sh "make"
  end
end
CLEAN.include "tests/jfk_reader/jfk_reader.{o,#{RbConfig::CONFIG['DLEXT']}}"

task test: [LIB_FILE, TEST_MEMORY_VIEW]
